package com.mayfool.gitmanager;

import com.formdev.flatlaf.FlatDarkLaf;
import com.mayfool.gitmanager.core.action.ActionManager;
import com.mayfool.gitmanager.core.action.ActionType;
import com.mayfool.gitmanager.core.entity.TaskInfo;
import com.mayfool.gitmanager.core.helper.LogHelper;
import com.mayfool.gitmanager.core.manager.ProjectManager;
import com.mayfool.gitmanager.core.manager.TaskManager;
import com.mayfool.gitmanager.ui.CredentialsConfigPanel;
import com.mayfool.gitmanager.ui.NewTaskDialog;
import com.mayfool.gitmanager.ui.dialog.GitLabImportDialog;
import com.mayfool.gitmanager.ui.panel.WorkspacePanel;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.io.File;

import javax.swing.*;
import javax.swing.event.ListSelectionEvent;

/**
 * @author zhou.xu
 * @description: Git管理工具主界面类
 * 实现了主要的UI布局和事件处理逻辑
 * 采用Swing框架开发，使用FlatLaf皮肤
 * @date 2025/3/12 13:29
 * @since JDK 1.8
 */
public class GitManagerUI extends JFrame {
    /**
     * 工作区面板，用于显示任务详细信息
     */
    private WorkspacePanel workspacePanel;
    
    /**
     * 新建任务按钮
     */
    private JButton newTaskBtn;
    
    /**
     * 删除任务按钮
     */
    private JButton deleteTaskBtn;
    
    /**
     * 日志显示区域
     */
    private JTextArea logArea;
    
    /**
     * 任务列表数据模型
     */
    private DefaultListModel<TaskInfo> taskListModel;
    
    /**
     * 任务列表控件
     */
    private JList<TaskInfo> taskList;

    /**
     * 构造函数
     * 初始化UI组件并设置布局
     */
    public GitManagerUI() {
        initComponents();
        initMenus();
        setupLayout();
        setupEventListeners();
    }

    /**
     * 初始化UI组件
     * 设置窗口属性和创建基本控件
     */
    private void initComponents() {
        // 设置FlatLaf暗色主题
        FlatDarkLaf.setup();

        // 初始化界面组件
        setTitle("Git多项目管理工具");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(1600, 1000);

        newTaskBtn = new JButton("新建任务");
        deleteTaskBtn = new JButton("删除任务");
        // 初始状态禁用删除按钮
        deleteTaskBtn.setEnabled(false);
        taskListModel = new DefaultListModel<>();
        taskListModel.addAll(TaskManager.getTasks());
        taskList = new JList<>(taskListModel);
        workspacePanel = new WorkspacePanel(null);
        logArea = new JTextArea();
    }

    /**
     * 初始化菜单栏
     * 创建主菜单及其子菜单项，设置快捷键
     */
    private void initMenus() {
        // 创建菜单栏
        JMenuBar menuBar = new JMenuBar();

        // 创建"操作"菜单
        JMenu actionMenu = new JMenu("操作");
        // 设置快捷键 Alt+A
        actionMenu.setMnemonic(KeyEvent.VK_A);

        // 创建扫描项目菜单项
        JMenuItem scanMenuItem = new JMenuItem("扫描项目");
        // 设置快捷键 S
        scanMenuItem.setMnemonic(KeyEvent.VK_S);
        // 设置组合快捷键 Ctrl+S
        scanMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_DOWN_MASK));
        // 绑定扫描方法
        scanMenuItem.addActionListener(e -> scanProjects());

        // 创建GitLab导入菜单项
        JMenuItem gitlabImportMenuItem = new JMenuItem("从GitLab导入");
        gitlabImportMenuItem.addActionListener(e -> {
            GitLabImportDialog dialog = new GitLabImportDialog(
                    (Frame) SwingUtilities.getWindowAncestor(this)
            );
            dialog.setVisible(true);
        });

        // 将菜单项添加到菜单
        actionMenu.add(scanMenuItem);
        actionMenu.add(gitlabImportMenuItem);

        // 将菜单添加到菜单栏
        menuBar.add(actionMenu);

        // 设置窗口菜单栏
        setJMenuBar(menuBar);
    }

    /**
     * 设置事件监听器
     * 为各个UI组件添加事件处理逻辑
     */
    private void setupEventListeners() {
        // 添加新建任务按钮点击事件
        newTaskBtn.addActionListener(this::handleNewTask);
        // 添加删除任务按钮点击事件
        deleteTaskBtn.addActionListener(this::handleDeleteTask);
        // 添加任务列表选择事件
        taskList.addListSelectionListener(this::handleTaskSelection);
        // 添加凭证设置动作监听器
        ActionManager.addListener(ActionType.SET_CREDENTIALS, e -> {
            CredentialsConfigPanel dialog = new CredentialsConfigPanel(e.getContent().toString());
            dialog.showDialog(this);
        });

        // 添加日志更新监听器
        LogHelper.getInstance().addChangeListener(e -> updateLogArea());
    }

    /**
     * 扫描项目
     * 打开文件选择器让用户选择要扫描的目录
     */
    private void scanProjects() {
        JFileChooser chooser = new JFileChooser();
        chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
            File dir = chooser.getSelectedFile();
            // 在新线程中执行扫描操作
            new Thread(() -> {
                ProjectManager.scanExistingProjects(dir);
                updateLogArea();
            }).start();
        }
    }

    /**
     * 处理新建任务事件
     * 显示新建任务对话框并保存任务信息
     */
    private void handleNewTask(ActionEvent e) {
        NewTaskDialog newTaskDialog = new NewTaskDialog();
        TaskInfo taskInfo = newTaskDialog.showDialog(this);

        if (taskInfo != null) {
            taskListModel.addElement(taskInfo);
            TaskManager.addTask(taskInfo);
            TaskManager.saveTasksToJson();
        }
    }

    /**
     * 处理任务选择事件
     * 当用户选择任务列表中的任务时更新工作区面板
     */
    private void handleTaskSelection(ListSelectionEvent e) {
        if (!e.getValueIsAdjusting()) {
            TaskInfo task = taskList.getSelectedValue();
            deleteTaskBtn.setEnabled(task != null); // 根据是否选中任务启用/禁用删除按钮
            if (task != null) {
                workspacePanel.changeTask(task);
            }
        }
    }

    /**
     * 处理删除任务事件
     * 删除选中的任务并更新UI
     * 
     * @param e 动作事件
     * @author zhou.xu
     * @date 2024-03-18 11:35:00
     */
    private void handleDeleteTask(ActionEvent e) {
        TaskInfo selectedTask = taskList.getSelectedValue();
        if (selectedTask != null) {
            // 创建自定义对话框面板
            JPanel panel = new JPanel();
            panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
            
            // 添加提示文本
            panel.add(new JLabel("确定要删除任务 '" + selectedTask.getTaskName() + "' 吗？"));
            panel.add(Box.createVerticalStrut(10));
            
            // 添加删除选项
            JCheckBox deleteBranchBox = new JCheckBox("删除关联的Git分支");
            JCheckBox deleteWorkspaceBox = new JCheckBox("删除本地工作空间目录");
            
            panel.add(deleteBranchBox);
            panel.add(deleteWorkspaceBox);
            
            int confirm = JOptionPane.showConfirmDialog(
                this,
                panel,
                "删除确认",
                JOptionPane.YES_NO_OPTION,
                JOptionPane.WARNING_MESSAGE
            );
            
            if (confirm == JOptionPane.YES_OPTION) {
                // 先处理Git分支和工作空间的删除
                if (deleteBranchBox.isSelected() || deleteWorkspaceBox.isSelected()) {
                    workspacePanel.handleTaskDeletion(
                        selectedTask,
                        deleteBranchBox.isSelected(),
                        deleteWorkspaceBox.isSelected()
                    );
                }
                
                // 删除任务
                if (TaskManager.removeTask(selectedTask)) {
                    taskListModel.removeElement(selectedTask);
                    workspacePanel.changeTask(null);
                    deleteTaskBtn.setEnabled(false);
                }
            }
        }
    }

    /**
     * 更新日志区域
     * 在EDT线程中更新日志显示
     */
    private void updateLogArea() {
        SwingUtilities.invokeLater(() -> {
            logArea.setText(LogHelper.getInstance().getLog());
            logArea.setCaretPosition(logArea.getDocument().getLength());
        });
    }

    /**
     * 设置界面布局
     * 使用分割面板组织界面结构
     */
    private void setupLayout() {
        // 创建工具面板
        JPanel toolPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
        toolPanel.add(newTaskBtn);
        toolPanel.add(deleteTaskBtn);

        // 创建任务列表滚动面板
        JScrollPane taskScrollPane = new JScrollPane(taskList);
        taskScrollPane.setPreferredSize(new Dimension(200, 400));

        // 创建任务面板
        JPanel taskPanel = new JPanel(new BorderLayout());
        taskPanel.add(toolPanel, BorderLayout.NORTH);
        taskPanel.add(taskScrollPane, BorderLayout.CENTER);

        // 创建日志面板
        JPanel logPanel = new JPanel(new BorderLayout());
        logPanel.add(new JLabel("操作日志:"), BorderLayout.NORTH);
        logPanel.add(new JScrollPane(logArea), BorderLayout.CENTER);

        // 创建工作区和日志区的垂直分割面板
        JSplitPane workAreaSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, workspacePanel, logPanel);
        workAreaSplitPane.setDividerLocation(600);
        
        // 创建任务列表和工作区的水平分割面板
        JSplitPane mainSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, taskPanel, workAreaSplitPane);
        mainSplitPane.setDividerLocation(250);
        
        add(mainSplitPane, BorderLayout.CENTER);
    }

    /**
     * 程序入口
     * 在EDT线程中创建并显示主窗口
     */
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new GitManagerUI().setVisible(true));
    }
}






